package com.example.hbase.handler;

import com.example.hbase.exception.HBaseException;
import org.springframework.util.Assert;

/**
 * @author void
 * @date 2021/11/26 14:18
 * @desc 抽象类类型处理器，对各个实现类的公共处理
 */
public abstract class AbstractTypeHandler implements TypeHandler{
    @Override
    public byte[] toBytes(Class<?> type, Object value) {
        Assert.notNull(type, "数据类型不能为空");
        
        if(!aboutToHandle(type)){
            throw new HBaseException("暂不支持映射的数据类型");
        }
        
        if(value==null){
            return null;
        }
        
        return innerToBytes(type, value);
    }

    @Override
    public Object toObject(Class<?> type, byte[] bytes) {
        Assert.notNull(type, "数据类型不能为空");

        if(!aboutToHandle(type)){
            throw new HBaseException("暂不支持映射的数据类型");
        }

        if(bytes==null || bytes.length==0){
            return null;
        }

        return innerToObject(type, bytes);
    }

    /**
     * 是否支持转化的java类型
     * @param type
     * @return
     */
    abstract protected boolean aboutToHandle(Class<?> type);

    /**
     * 将java对象值映射为字节数组
     * @param type  准备被转换的java数据类型 eg：Integer,Double,Boolean
     * @param value 数据
     * @return
     */
    abstract protected byte[] innerToBytes(Class<?> type, Object value);

    /**
     * 将字节映射为java对象值
     * @param type  准备转换为的java数据类型 eg：Integer,Double,Boolean
     * @param bytes 数据
     * @return
     */
    abstract protected Object innerToObject(Class<?> type, byte[] bytes);
}
